home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / X11R4 / cmds / X / ddx / dec / qdss / libtl / tlpolytext.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-12-05  |  8.3 KB  |  323 lines

  1. /***********************************************************
  2. Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts,
  3. and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
  4.  
  5.                         All Rights Reserved
  6.  
  7. Permission to use, copy, modify, and distribute this software and its 
  8. documentation for any purpose and without fee is hereby granted, 
  9. provided that the above copyright notice appear in all copies and that
  10. both that copyright notice and this permission notice appear in 
  11. supporting documentation, and that the names of Digital or MIT not be
  12. used in advertising or publicity pertaining to distribution of the
  13. software without specific, written prior permission.  
  14.  
  15. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  16. ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
  17. DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  18. ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  19. WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  20. ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  21. SOFTWARE.
  22.  
  23. ******************************************************************/
  24.  
  25. /*
  26.  * SETVIPER does not yet initialize LU_R4, upon which INITTEXT* depends,
  27.  * so we do the following hacks:                XX
  28.  */
  29. #if NPLANES==8
  30. #undef NPLANES
  31. #define NPLANES 24
  32. #define GETGREENBYTE( p)    ((p)<<8)
  33. #else
  34. #define GETGREENBYTE( p)        (p)
  35. #endif
  36.  
  37. #include "X.h"
  38. #include "Xproto.h"        /* required by fontstruct.h */
  39.  
  40. #include "gcstruct.h"
  41. #include "scrnintstr.h"
  42. #include "windowstr.h"
  43. #ifndef X11R4
  44. #include "fontstr.h"
  45. #else
  46. #include "fontstruct.h"
  47. #include "dixfontstr.h"
  48. #endif /* X11R4 */
  49.  
  50. #include "qd.h"
  51. #include "qdgc.h"
  52.  
  53. #include <sys/types.h>
  54. #include "Ultrix2.0inc.h"
  55. #include <vaxuba/qduser.h>
  56. #include <vaxuba/qdreg.h>
  57.  
  58. #include "tl.h"
  59. #include "tltemplabels.h"
  60.  
  61. #define LOG2OF1024    10
  62. #define u_char unsigned char
  63. #define TEXT_INIT_NEEDED 10
  64. #define MAGIC_POS 0
  65.  
  66. #ifndef PROCNAME
  67. # define PROCNAME tlPolyText
  68. #endif
  69.  
  70. extern int    Nplanes;
  71.  
  72. #ifdef IMAGE
  73. void
  74. #else    /* PolyText returns width */
  75. int
  76. #endif
  77. PROCNAME( pDraw, pGC, x0, y0, nChars, pStr)
  78.     DrawablePtr pDraw;        /* Not used; location is found in
  79.                  * pGC->lastWinOrg, which works for
  80.                  * both Windows and Pixmaps. */
  81.     GCPtr       pGC;
  82.     int        x0, y0;        /* origin */
  83.     int        nChars;
  84.     char *    pStr;
  85. {
  86.     DDXPointRec        absCorner;
  87. #ifndef X11R4
  88.     EncodedFontPtr    pFont = pGC->font;
  89.     CharSetPtr        pcs = pFont->pCS;
  90.     int            chfirst = pFont->firstCol;
  91.     int            chlast = pFont->lastCol;
  92.     CharInfoPtr     *ppCI = pFont->ppCI - chfirst;
  93. #else
  94.     FontPtr        pFont = pGC->font;
  95.     FontInfoPtr        pfi = pFont->pFI;
  96.     int            chfirst = pfi->firstCol;
  97.     int            chlast = pfi->lastCol;
  98.     CharInfoPtr     pCI;
  99. #endif /* X11R4 */
  100.     int            fontY;    /* Y address of off-screen font */
  101.     int            fontPmask /* plane address of off-screen font */
  102.                 = LoadFont( pDraw->pScreen, pFont, &fontY);
  103.     RegionPtr        pcompclip = QDGC_COMPOSITE_CLIP(pGC);
  104.     struct DMAreq *    pRequest;
  105.     BoxPtr        pboxes;    /* a temporary */
  106.     QDFontPtr        qdfont =
  107.                 (QDFontPtr) pFont->devPriv[ pGC->pScreen->myNum];
  108.     register unsigned short *p;
  109.     register u_char *    pstr;
  110.     register int    nxbits = LOG2OF1024-qdfont->log2dx;
  111.     int            width = qdfont->width & 0x3fff;
  112.     register int    leftKern = qdfont->leftKern;
  113.     int            log2dx = qdfont->log2dx;
  114.     int         height = qdfont->ascent + qdfont->descent;
  115.     int            ic;
  116.     register int    xc;
  117.     int            maxcharblits = (MAXDMAWORDS-TEXT_INIT_NEEDED)/3;
  118.  
  119.     if (nChars == 0)
  120. #ifdef IMAGE
  121.     return;
  122. #else
  123.     return x0;    
  124.  
  125. #ifndef SOLID
  126.     INSTALL_FILLSTYLE(pGC, pDraw);
  127. #endif
  128. #endif
  129.  
  130. #ifdef X11R4
  131.     pCI = &pFont->pCI[-chfirst];
  132.     pfi = pFont->pFI;
  133. #endif /* X11R4 */
  134.  
  135.     absCorner = pGC->lastWinOrg;
  136. #ifdef USE_TRANS
  137. #define TRANS(x_or_y, val) ((val)+absCorner.x_or_y)
  138. #else
  139. #define TRANS(x_or_y, val) (val)
  140.     x0 += absCorner.x;
  141.     y0 += absCorner.y;
  142. #endif
  143.  
  144.     SETTRANSLATEPOINT(TRANS(x,0), TRANS(y,0));
  145.  
  146. # ifdef IMAGE
  147.     Need_dma(6);
  148.     *p++ = JMPT_SET_MASKED_ALU;
  149.     *p++ = pGC->planemask;
  150.     *p++ = LF_SOURCE | FULL_SRC_RESOLUTION;
  151.     *p++ = JMPT_SETFOREBACKCOLOR;
  152.     *p++ = pGC->fgPixel;
  153.     *p++ = pGC->bgPixel;
  154. # else
  155.     Need_dma(5);
  156.     *p++ = JMPT_SET_MASKED_ALU;
  157.     *p++ = pGC->planemask;
  158.     *p++ = umtable[ pGC->alu];
  159.     *p++ = JMPT_SETCOLOR;
  160.     *p++ = pGC->fgPixel;
  161. # endif
  162.     Confirm_dma();
  163.  
  164. #ifndef IMAGE
  165.     xc = MAGIC_POS; /* to detect if no painting was done, due to clipping */
  166. #endif
  167.  
  168.     for (ic = REGION_NUM_RECTS(pcompclip), pboxes = REGION_RECTS(pcompclip);
  169.      --ic >= 0; pboxes++) {
  170.     int            nch = nChars;
  171. #ifdef IMAGE
  172.     unsigned short *    px2clip;
  173. #endif
  174.  
  175.     /* do trivial-reject Y clipping */
  176.         if ( TRANS(y,y0) - qdfont->ascent        >= pboxes->y2
  177.       || TRANS(y,y0) + qdfont->descent        < pboxes->y1) 
  178.         continue;
  179.  
  180.     pstr = (u_char *) pStr;
  181.     xc = x0;
  182.  
  183.     while( nch) {
  184.         /*
  185.          * The SETCLIP and INITTEXT* calls could be moved
  186.          * outside this loop - except then the "sleazoid hack"
  187.          * would break. In practice, there will only
  188.          * be one iteration anyway.
  189.          */
  190.         int n = min( nch, maxcharblits);
  191.         nch -= n;
  192.         Need_dma(TEXT_INIT_NEEDED + 3*n);
  193.         *p++ = JMPT_SETCLIP;
  194.         *p++ = pboxes->x1;
  195. #ifdef IMAGE
  196.         px2clip = p;      /* set up for ultimate sleazoid hack */
  197. #endif
  198.         *p++ = pboxes->x2;
  199.         *p++ = pboxes->y1;
  200.         *p++ = pboxes->y2;
  201.  
  202. #ifdef IMAGE
  203.         *p++ = JMPT_INITTEXTTERM;
  204. #else
  205. #ifdef SOLID
  206.         *p++ = JMPT_INITTEXTSOLID;
  207. #else
  208.         *p++ = JMPT_INITTEXTMASK;
  209. #endif
  210. #endif
  211.         *p++ = width;                /*dx*/
  212.         *p++ = height;                /*dy*/
  213.         *p++ = fontPmask;
  214.         *p++ = y0 - qdfont->ascent & 0x3fff;
  215. #ifdef IMAGE
  216. #ifndef X11R4
  217.         if (leftKern == 0 && width == pcs->minbounds.characterWidth)
  218. #else
  219.         if (leftKern == 0 && width == pfi->minbounds.metrics.characterWidth)
  220. #endif /* X11R4 */
  221.           while ( n--) {
  222.         register unsigned int ch = *pstr++;
  223.  
  224.         if ( ch < chfirst || ch > chlast) {
  225. #ifndef X11R4
  226.             ch = pFont->defaultCh;        /* step on the arg */
  227. #else
  228.             ch = pFont->pFI->chDefault;        /* step on the arg */
  229. #endif /* X11R4 */
  230.             if ( ch < chfirst || ch > chlast) continue;
  231.         }
  232.         *p++ = (ch << log2dx) & 1023;    /* source X */
  233.         *p++ = (ch >> nxbits) * height + fontY;    /* source Y */
  234.         *p++ = xc & 0x3fff;            /* destination X */
  235.         xc += width;
  236.         }
  237.         else
  238. #endif /* IMAGE */
  239.         while ( n--) {
  240.         register unsigned int ch = *pstr++;
  241.  
  242.         if ( ch < chfirst || ch > chlast) {
  243. #ifndef X11R4
  244.             ch = pFont->defaultCh;        /* step on the arg */
  245. #else
  246.             ch = pFont->pFI->chDefault;    /* step on the arg */
  247. #endif /* X11R4 */
  248.             if ( ch < chfirst || ch > chlast) continue;
  249.         }
  250. #ifndef SOLID
  251.         /* There seems to be a hardware problem such that
  252.          * you cannot do left edge clipping if you are also using
  253.          * both source cycles.
  254.          */
  255.         if (TRANS(x,xc) - leftKern < pboxes->x1) {
  256.             int skip = pboxes->x1 - TRANS(x,xc) + leftKern;
  257.             if (skip < width) {
  258.             Confirm_dma();
  259.             Need_dma(8);
  260.             *p++ = JMPT_INITTEXTMASK;
  261.             *p++ = (width - skip) & 0x3fff;            /*dx*/
  262.             *p++ = height & 0x3fff;                /*dy*/
  263.             *p++ = fontPmask;
  264.             *p++ = y0 - qdfont->ascent & 0x3fff;
  265.             *p++ = ((ch << log2dx) & 1023) + skip;    /* source X */
  266.             *p++ = (ch >> nxbits) * height + fontY;    /* source Y */
  267.             *p++ = (pboxes->x1 - TRANS(x, 0)) & 0x3fff;
  268.             Confirm_dma();
  269.             Need_dma(5 + 3*n);
  270.             }
  271.         } else
  272. #endif
  273.         {
  274.             *p++ = (ch << log2dx) & 1023;    /* source X */
  275.             *p++ = (ch >> nxbits) * height + fontY;    /* source Y */
  276.             *p++ = xc - leftKern & 0x3fff;    /* destination X */
  277.         }
  278. #ifndef X11R4
  279.         xc += ppCI[ch]->metrics.characterWidth;
  280. #else
  281.         xc += pCI[ch].metrics.characterWidth;
  282. #endif /* X11R4 */
  283.         }
  284. #ifdef IMAGE
  285.         /*
  286.          * Ultimate sleazoid hack to clip off ragged, background-colored,
  287.          * right-hand side of glyphs.
  288.          */
  289.         *px2clip = min( *px2clip, TRANS(x,xc));
  290. #endif
  291.         Confirm_dma();
  292.     }
  293.     }
  294. #ifdef IMAGE
  295.     Need_dma(1);
  296.     *p++ = JMPT_RESET_FORE_BACK;
  297.     Confirm_dma();
  298. #else
  299.     Need_dma(2);
  300.     *p++ = JMPT_SETMASK;
  301.     *p++ = 0xFFFF;
  302.     Confirm_dma();
  303.     if (xc == MAGIC_POS) {
  304.     xc = x0;
  305.     pstr = (u_char *) pStr;
  306.     while ( nChars--) {
  307.         ic = *pstr++;
  308.         if ( ic >= chfirst && ic <= chlast)
  309. #ifndef X11R4
  310.         xc += ppCI[ic]->metrics.characterWidth;
  311. #else
  312.         xc += pCI[ic].metrics.characterWidth;
  313. #endif /* X11R4 */
  314.       }
  315.     }
  316. #ifdef USE_TRANS
  317.     return xc;
  318. #else
  319.     return xc - absCorner.x;
  320. #endif
  321. #endif
  322. }
  323.